REM >Director:Menus.Files.MenuMenu

ON ERROR: ON ERROR OFF: ERROR ERR,REPORT$+" at "+STR$ ERL
MenuName$="MenuMenuMenu"

buffer_size%=1024
DIM buffer% buffer_size%

Menu%=FNswi_number("Director_Menu")
EndMenu%=FNswi_number("Director_EndMenu")
Option%=FNswi_number("Director_Option")
Command%=FNswi_number("Director_Command")
Dash%=FNswi_number("Director_Dash")
XOS_ReadVarVal%=FNswi_number("XOS_ReadVarVal")
XOS_SetVarVal%=FNswi_number("XOS_SetVarVal")
XOS_FSControl%=FNswi_number("XOS_FSControl")
XOS_File%=FNswi_number("XOS_File")
OSVer%=EVAL(FNread("Director$OSVersion"))

PROCset("Director$Menu",MenuName$)
FileLeaf$=FNread("Director$CurrentLeaf")
IF FileLeaf$="" THEN
  *DirectorMouseDir x -file
  *DirectorParsePath <x>
  FileLeaf$=FNread("Director$CurrentLeaf")
  IF FileLeaf$="" THEN END
ENDIF

FileDir$=FNpath(FNread("Director$CurrentPath"))
IF FNifthereis(FileDir$+"."+FileLeaf$,0) END
IF FileDir$<>FNpath(FileLeaf$) FilePath$=FileDir$+"."+FileLeaf$ ELSE FileDir$="":FilePath$=FileLeaf$
DirPath$=FileDir$
DirLeaf$=FNleaf(DirPath$)
DirDir$=FNpath(DirPath$)
PROCset("Leaf",FNleaf(FilePath$))
PROCset("Path",FilePath$)
PROCset("Dir",FNpath(FilePath$))
cvs%=FNifcommand("cvs")

SYS "XOS_File",23,FilePath$ TO ObjType%,,LoadAddr%,,,,Type%;Flags%
IF ObjType%=3 AND (LoadAddr% AND &FFF00000)=&FFF00000 THEN
  Type%=(LoadAddr% AND &FFF00) >> 8
ENDIF
IF (Flags% AND 1) THEN END
REM PRINT ObjType%,~LoadAddr%,Type%

SYS Menu%,FileLeaf$+" "+MenuName$+" -temp"
  SYS Option%,FileLeaf$+" -path "+FilePath$+" -up"

CASE Type% OF
  WHEN &2000: Type$="App."
  WHEN &1000: Type$="Dir."
  OTHERWISE:  Type$="File"
ENDCASE
  SYS Option%,""""+Type$+" '"+FileLeaf$+"'"" -sub ""Dynamic:/Director:Menus.Files.FilerMenu "+FileDir$+" "+FileLeaf$+""""
    SYS Command%,"Save:"+FilePath$
   SYS Option%,"""Delete '"+FileLeaf$+"'"" -fg <Director$Red>"
     SYS Command%,"/Director:Utils.RunFilerAc 2"
   IF ObjType%<>2 THEN
     SYS Option%, """Set type"" -sub ""Dynamic:/Director:Menus.Files.FilerMenu -menu SetType"""
       SYS Command%
   ENDIF

IF DirPath$<>"" THEN
  SYS Dash%
    SYS Option%,"""Set work directory to '"+DirLeaf$+"'"""
      SYS Command%,"Dir "+DirPath$
    IF LEFT$(DirLeaf$,1)="!" THEN
      SYS Option%,"""Boot '"+DirLeaf$+"'"""
        SYS Command%,"Filer_Boot "+DirPath$
    ENDIF
    SYS Option%,"""Open '"+DirLeaf$+"'"""
      SYS Command%,"Filer_OpenDir "+DirPath$
    SYS Option%,"""Pin '"+DirLeaf$+"'"""
      SYS Command%,"SWI OS_Mouse TO x y|MPin "+DirPath$+" |<x>-90 |<y>+45"
    SYS Option%,"""AddTinyDir '"+DirLeaf$+"'"""
      SYS Command%,"AddTinyDir "+DirPath$
    SYS Option%,"Command -sub *"
    IF cvs% AND FNifthereis(DirPath$+".CVS",2) THEN
      SYS Option%, """CVS '"+DirLeaf$+"'"" -sub ""Dynamic:/Director:Menus.Files.CVSMenu "+DirDir$+" "+DirLeaf$+""""
    ENDIF
  SYS Dash%
ENDIF
REM If FilePath$=DirPath$ then we're at the at the root of a Directory

IF FilePath$<>DirPath$ AND Type%>=&1000 THEN
SYS Dash%
  SYS Option%,"""Set work directory to '"+FileLeaf$+"'"""
    SYS Command%,"Dir "+FilePath$
  IF LEFT$(FileLeaf$,1)="!" THEN
    SYS Option%,"""Boot '"+FileLeaf$+"'"""
      SYS Command%,"Run "+FilePath$+".!Boot"
  ENDIF
  SYS Option%,"""Open '"+FileLeaf$+"'"""
    SYS Command%,"Filer_OpenDir "+FilePath$
  SYS Option%,"""Pin '"+FileLeaf$+"'"""
    SYS Command%,"SWI OS_Mouse TO x y|MPin "+FilePath$+" |<x>-90 |<y>+45"
  SYS Option%,"""AddTinyDir '"+FileLeaf$+"'"""
    SYS Command%,"AddTinyDir "+FilePath$
  SYS Option%,"Command -sub *"
  IF cvs% AND FNifthereis(FilePath$+".CVS",2) THEN
    SYS Option%, """CVS '"+FileLeaf$+"'"" -sub ""Dynamic:/Director:Menus.Files.CVSMenu "+FileDir$+" "+FileLeaf$+""""
  ENDIF
ENDIF

IF Type%<&1000 THEN
SYS Dash%
  SYS Option%,"Filer_Run"
    SYS Command%,"Filer_Run "+FilePath$
  SYS Option%,"Edit"
    SYS Command%,"DirectorEdit "+FilePath$
  SYS Option%,"EditOutput"
    SYS Command%,"/Director:Utils.EditOutput "+FilePath$
  SYS Option%,"""Task window"" -sub ""Dynamic:/Director:Menus.Files.TaskArgs"""
    SYS Command%,"TaskWindow """+FilePath$+""" -display -quit -name "+FileLeaf$
  IF cvs% AND FNifthereis(FileDir$+".CVS",2) THEN
    SYS Option%, """CVS '"+FileLeaf$+"'"" -sub ""Dynamic:/Director:Menus.Files.CVSMenu "+FileDir$+" "+FileLeaf$+""""
  REM IF zip% SYS Option%,"""Zip '"+FileLeaf$+"'"" -sub ""Dynamic:/Director:Menus.Files.ZipMenu "+FileDir$+" "+FileLeaf$+""""
  ENDIF
ENDIF

REM Sprites
IF Type%=&FF9 THEN
SYS Dash%
  IF OSVer%>=436 OR NOT FNrmensure("AddSprites") THEN
    SYS Option%,"IconSprites -sub ""Dynamic:/Director:Menus.Files.IconsSub "+FilePath$+""""
  ELSE
    SYS Option%,"IconSprites"
      SYS Command%,"NewIcons "+FilePath$
  ENDIF
  SYS Option%,"ToolSprites"
    SYS Command%,"NewTools "+FilePath$
  SYS Option%,"Backdrop -sub SetBackdrop"
    SYS Command%,"Backdrop -Tile "+FilePath$
  SYS Option%,"AddSprites -sub AddSprites"
ENDIF

REM Obey
IF Type%=&FD6 OR Type%=&FD7 OR Type%=&FEB OR Type%=&FEA THEN
SYS Dash%
  SYS Option%,"DirectorObey"
    SYS Command%,"DirectorObey "+FilePath$
  SYS Option%,"""DirectorObey -v"""
    SYS Command%,"TaskWindow ""DirectorObey -v "+FilePath$+""" -quit"
  SYS Option%,"""Obey -v"""
    SYS Command%,"TaskWindow ""Obey -v "+FilePath$+""" -quit"
ENDIF

REM Module
IF Type%=&FFA THEN
SYS Dash%
  SYS Option%,"""Module Info"" -sub ""Dynamic:/Director:Menus.System.ModuleInfo "+FilePath$+""""
ENDIF

SYS Dash%
  SYS Option%,"Memoriser -sub Memoriser:"

SYS EndMenu%

END



DEF FNswi_number(name$)
  SYS &39,,name$ TO A%
=A%

DEF FNstring(ptr%):LOCAL a$:a$=""
WHILE ?ptr%>31
  a$+=CHR$(?ptr%):ptr%+=1
ENDWHILE:=a$

DEF FNread(a$)
  ?buffer%=13
  SYS XOS_ReadVarVal%,a$,buffer%,buffer_size%,0,3 TO ,,read%
  buffer%?read%=13
=$buffer%

DEF PROCset(a$,v$)
  SYS XOS_SetVarVal%,a$,v$,LEN v$,0,0
ENDPROC

DEF FNleaf(f$)
LOCAL l%
  l%=LEN f$:REPEAT l%-=1:UNTIL MID$(f$,l%,1)="."ORl%<1
=MID$(f$,l%+1)

DEF FNpath(f$)
LOCAL l%
  l%=LEN f$:REPEAT l%-=1:UNTIL MID$(f$,l%,1)="."ORl%<1
=LEFT$(f$,l%-1)

REM Returns TRUE if the supplied module title doesn't exist
DEF FNrmensure(m$)
LOCAL c%
SYS "XOS_Module",18,m$ TO ,,,c%
=(c%=0)

DEF FNifthereis(o$,t%)
SYS "XOS_File", 17, o$ TO s%;f%
IF f% AND 1 THEN =FALSE
=(s%=t%)

DEF FNifcommand(c$):LOCAL t%
SYS XOS_FSControl%,11,"Null:"
SYS XOS_FSControl%,37,c$,buffer%,,"Run:",1023
SYS XOS_File%,23,buffer% TO t%
IF t%=1 THEN =TRUE
SYS XOS_ReadVarVal%,"Alias$"+c$,buffer%,-1 TO ,,t%
=(t%<>0)
